
#ifndef _Oz_Webui_AbstractView_H_
#define _Oz_Webui_AbstractView_H_

#include <Oz/Webui/Webui.h>
#include <Oz/Webui/IRequestCycle.h>
#include <Oz/Webui/ICacheable.h>

namespace Oz{
    namespace Webui{

        /**
         * Esta clase representa la interfaz de una vista.
         **/

        class IAbstractView : virtual public ICacheable,virtual public IRequestCycle{
            public:
            /**
             * Destructor virtual
             **/
            virtual ~IAbstractView();

            /**
             * Devuelve el nombre de la vista.
             */
            virtual const std::string getName()const = 0;

            /**
             * Valida el arbol de vista
             */
            virtual const bool validate() = 0;

            /**
             * Permite acceder al objeto aplicacion.
             **/
            virtual IAbstractApplicationPtr application()const = 0;


            /**
             * Indica si la vista es visible.
             **/
            virtual const bool isVisible()const = 0;

            /**
             * Estable el estado de la propieda es visible de la vista.
             **/
            virtual const bool setVisible(bool visible) = 0;


            /**
             * Inserta una vista en esta vista.
             **/
            virtual void addChild(IAbstractViewPtr view) = 0;

            /**
             * Permite acceder a una vista hija.
             **/
            virtual IAbstractViewPtr getChild(const std::string& name)const = 0;

            /**
             * Permite acceder a la vista padre.
             **/
            virtual IAbstractViewPtr getParent()const = 0;

            /**
             * Devuelve un mapa con las visas hijas.
             **/

            virtual IAbstractViewMap getChilds()const = 0;

            virtual bool hasChild(const std::string& name)const = 0;

            /**
             * Devuelve el numero de vistas hijas de esta vista.
             **/
            virtual int countChilds()const = 0;

            /**
             * Actualiza los datos de la vista.
             **/
            virtual void load() = 0;

            /**
             * Evia un evento al que puede reacionar otros objetos.
             **/
            virtual void postEvent() const = 0;


            virtual IAbstractUrlAdapterPtr getUrlAdapter()= 0;

            virtual void setUrlAdapter(const IAbstractUrlAdapterPtr& urladapter) = 0;

            /**
             * Asinga el atributo title de la vista.
             **/
            virtual void setTitle(const std::string& title) = 0;

            /**
             * Recupera el atributo title asignado.
             */
            virtual const std::string getTitle()const = 0;


            virtual Oz::IRequestPtr getRequest()const = 0;

           /**
            * Permite acceder al objeto response.
            **/
            virtual Oz::IResponsePtr getResponse()const = 0;

           /**
            * Este metodo se encarga de procesar un request.
            **/
            virtual Oz::IResponsePtr processRequest(const Oz::IRequestPtr& request) = 0;

            protected:
            IAbstractView();
            IAbstractView& operator=(const IAbstractView& rhs);
        };
    }
}
#endif
